unit InformatiePopup_Unit;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls,
  TVGidsNLProgramma_Unit,
  Mededeling_Unit;

type
  TD_TaskbarLocatie = (TB_ONDER, TB_BOVEN, TB_RECHTS, TB_LINKS);

  TInformatiePopup_Form = class(TForm)
    Memo: TMemo;
    procedure MemoClick(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
    activeMededeling: TMededeling;
    procedure fadeIn;
    procedure fadeOut;
    procedure instellingFormLocatie();
    procedure bureaubladVerandering( var Msg: TMessage); message WM_SETTINGCHANGE;
    procedure showMededeling(timeout: Integer;fadeEffect: Boolean;mededeling: TMededeling);
  public
    { Public declarations }
    function getActiveMededeling() : TMededeling;
    procedure stayOnTop();
    procedure hideMededeling(fadeEffect: Boolean);
    procedure showEenMededeling(mededeling: TMededeling);
    procedure showEenAanmeldenMededeling(mededelingOnClick: TMededelingOnClick);
    procedure showEenGeenProgrammasMededeling(mededelingOnClick: TMededelingOnClick);
    procedure showEenProbleemMededeling(mededelingOnClick: TMededelingOnClick);
    procedure showEenAndereTVScannerVersieMededeling(mededelingOnClick: TMededelingOnClick);
    procedure AfterConstruction; override;
    procedure BeforeDestruction; override;
  end;

implementation

{$R *.dfm}

  {
    * getActiveMededeling
  }
  function TInformatiePopup_Form.getActiveMededeling() : TMededeling;
  begin
    result := activeMededeling;
  end;

  {
    * showMededeling
  }
  procedure TInformatiePopup_Form.showMededeling(timeout: Integer;fadeEffect: Boolean;mededeling: TMededeling);
  begin

    //nieuwe active mededeling creeren
    activeMededeling := mededeling;

    //timeout overschrijven
    activeMededeling.var_counter := timeout;

    //tekst tonen op het informatiePopup_Form
    Self.Memo.Clear();
    Self.Memo.Lines := activeMededeling.var_tekst;

    //controleren of we met fadeEffect werken
    if fadeEffect then
      Self.fadeIn();

  end;

  {
    * hideMededeling
  }
  procedure TInformatiePopup_Form.hideMededeling(fadeEffect: Boolean);
  begin

    //activeMededeling vrijgeven en nil maken
    activeMededeling.free();
    activeMededeling := nil;

    //controleren of we met fadeEffect werken
    if fadeEffect then
      Self.fadeOut();
  end;


  {
    * showAanmeldenMededeling
  }
  procedure TInformatiePopup_Form.showEenAanmeldenMededeling(mededelingOnClick: TMededelingOnClick);
  var
    mededeling: TMededeling;
  begin
 
    //programma Mededeling Tekst aanmaken
    mededeling := Tmededeling.Create();
    mededeling.var_tekst.Add('U bent niet ingelogd!');
    mededeling.var_tekst.Add('');
    mededeling.var_tekst.Add('Hierdoor worden geen');
    mededeling.var_tekst.Add('programma meldingen');
    mededeling.var_tekst.Add('getoond!');
    mededeling.var_tekst.Add('');
    mededeling.var_tekst.Add('Klik hier om in te loggen!');

    //OnClick event instellen
    mededeling.var_mededelingOnClickAdres := 'http://www.tvgids.nl/perstvgids/';
    mededeling.var_mededelingOnClick := mededelingOnClick;

    //mededeling 20 seconden tonen
    showMededeling(20, True, mededeling);
  end;

  {
    *  showProgrammaMededeling
  }
  procedure TInformatiePopup_Form.showEenMededeling(mededeling: TMededeling);
  begin

    //mededeling 15 seconden tonen
    showMededeling(15, True, mededeling);
  end;

  {
    * showGeenProgrammasMededeling
  }
  procedure TInformatiePopup_Form.showEenGeenProgrammasMededeling(mededelingOnClick: TMededelingOnClick);
  var
    mededeling: TMededeling;
  begin

    //Mededeling Tekst aanmaken
    mededeling := Tmededeling.Create();
    mededeling.var_tekst.Add('U heeft geen programma''s');
    mededeling.var_tekst.Add('In uw persoonlijke TVGids!');
    mededeling.var_tekst.Add('');
    mededeling.var_tekst.Add('Hierdoor worden geen');
    mededeling.var_tekst.Add('programma meldingen');
    mededeling.var_tekst.Add('getoond!');
    mededeling.var_tekst.Add('');
    mededeling.var_tekst.Add('Klik hier om programma''s te zoeken!');

    //OnClick event instellen
    mededeling.var_mededelingOnClickAdres := 'http://www.tvgids.nl';
    mededeling.var_mededelingOnClick := mededelingOnClick;

    //mededeling 10 seconden tonen
    showMededeling(10, True, mededeling);
  end;

  {
    * showProbleemMededeling
  }
  procedure TInformatiePopup_Form.showEenProbleemMededeling(mededelingOnClick: TMededelingOnClick);
  var
    mededeling: TMededeling;
  begin

    //Mededeling Tekst aanmaken
    mededeling := Tmededeling.Create();
    mededeling.var_tekst.Add('Er gaat iets fout!');
    mededeling.var_tekst.Add('');
    mededeling.var_tekst.Add('Excusses voor het');
    mededeling.var_tekst.Add('ongemak!');
    mededeling.var_tekst.Add('');
    mededeling.var_tekst.Add('Klik hier voor www.TVScanner.nl!');

    //OnClick event instellen
    mededeling.var_mededelingOnClickAdres := 'http://www.tvscanner.nl';
    mededeling.var_mededelingOnClick := mededelingOnClick;

    //mededeling 10 seconden tonen
    showMededeling(10, True, mededeling);
  end;

  {
    *
  }
  procedure TInformatiePopup_Form.showEenAndereTVScannerVersieMededeling(mededelingOnClick: TMededelingOnClick);
  var
    mededeling: TMededeling;
  begin

    //Mededeling Tekst aanmaken
    mededeling := Tmededeling.Create();
    mededeling.var_tekst.Add('Er is een andere versie van TVScanner beschikbaar!');
    mededeling.var_tekst.Add('');
    mededeling.var_tekst.Add('U wordt aangeraden deze versie zsm te installeren');
    mededeling.var_tekst.Add('U kunt deze versie downloaden op www.TVScanner.nl');
    mededeling.var_tekst.Add('');
    mededeling.var_tekst.Add('Klik hier voor de nieuwste versie!');

    //OnClick event instellen
    mededeling.var_mededelingOnClickAdres := 'http://www.tvscanner.nl/download.php';
    mededeling.var_mededelingOnClick := mededelingOnClick;

    //mededeling 20 seconden tonen
    showMededeling(20, True, mededeling);
  end;

  {
    *
  }
  procedure TInformatiePopup_Form.fadeIn;
  begin
    Show;
    Repaint;
    while AlphaBlendValue < 255 do
    begin
      AlphaBlendValue := AlphaBlendValue + 5;
      Sleep(1);
    end;
  end;

  {
    *
  }
  procedure TInformatiePopup_Form.fadeOut;
  begin
    while AlphaBlendValue > 0 do
    begin
      AlphaBlendValue := AlphaBlendValue - 5;
      Sleep(1);
    end;
    Hide;
  end;

  {
    * FormClose
  }
  procedure TInformatiePopup_Form.FormClose(Sender: TObject;
  var Action: TCloseAction);
  begin

    //form niet vrijgeven maar alleen verbergen
    Action := caHide;
  end;

  {
    * stayOnTop
  }  
  procedure TInformatiePopup_Form.stayOnTop();
  begin

    //form on top zetten als deze zichtbaar is
    if Self.Visible then
      SetWindowPos(Self.Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOACTIVATE or SWP_NOSIZE);
  end;


  {
    * instellingFormLocatie
  }
  procedure TInformatiePopup_Form.instellingFormLocatie();
  var
    hTaskbar: HWND;
    werkvlakOppervlak: TRect;
    taskbarOppervlak: TRect;
    taskbarLocatie: TD_TaskbarLocatie;
  begin
    //controleren taskbar locatie

    //locatie van taskbar ophalen
    hTaskBar := FindWindow( 'Shell_TrayWnd', nil );
    GetWindowRect( hTaskBar, taskbarOppervlak );

    //ophalen workspace van bureaublad
    systemparametersinfo (SPI_GETWORKAREA,0,@werkvlakOppervlak,0);


    //bepalen locatie taskbar
    taskbarLocatie := TB_RECHTS;
    if ( ( taskbarOppervlak.Top > (werkvlakOppervlak.Bottom Div 2) ) And ( taskbarOppervlak.Right >= werkvlakOppervlak.Right ) ) Then
        taskbarLocatie := TB_ONDER
    else
    if ( ( taskbarOppervlak.Top < (werkvlakOppervlak.Bottom Div 2) ) And ( taskbarOppervlak.Bottom <= werkvlakOppervlak.Right Div 2 ) ) Then
        taskbarLocatie := TB_BOVEN
    else
    if ( ( taskbarOppervlak.left < (werkvlakOppervlak.Right Div 2) ) And ( taskbarOppervlak.Top <= 0 ) ) Then
        taskbarLocatie := TB_LINKS;

    //taskbar onder
    case taskbarLocatie of

      //de form rechts onder in beeld zetten
      TB_ONDER: begin
                  left:=werkvlakOppervlak.right-Self.width;
                  top:=werkvlakOppervlak.bottom-Self.height;
                end;
      //de form rechts boven in beeld zetten
      TB_BOVEN: begin
                  left:=werkvlakOppervlak.right-Self.width;
                  top:=werkvlakOppervlak.Top;
                end;
      //de form rechts boven in beeld zetten
      TB_RECHTS: begin
                   left:=werkvlakOppervlak.right-Self.width;
                   top:=werkvlakOppervlak.Top;
                end;
      //de form links onder in beeld zetten
      TB_LINKS: begin
                  left:=werkvlakOppervlak.Left;
                  top:=werkvlakOppervlak.bottom-Self.height;
                end;
    end;
  end;

  {
    * MemoClick
  }
  procedure TInformatiePopup_Form.MemoClick(Sender: TObject);
  begin

    //controleren of een OnClick event procedure is gekoppeld, indien zo dan deze event aanroepen
    if Assigned(activeMededeling.var_mededelingOnClick) then
      activeMededeling.var_mededelingOnClick();
  end;

  {
    * bureaubladVerandering
  }
  procedure TInformatiePopup_Form.bureaubladVerandering(var Msg: TMessage);
  begin

    //controleren of het om een workArea message gaat
    if (Msg.WParam=SPI_SETWORKAREA) then
    begin

      //locatie van het form aanpassen
      instellingFormLocatie();
    end;
  end;

  {
    * AfterConstruction
  }
  procedure TInformatiePopup_Form.AfterConstruction;
  begin

    //locatie van het form aanpassen
    instellingFormLocatie();
  end;

  {
    * BeforeDestruction
  }
  procedure TInformatiePopup_Form.BeforeDestruction;
  begin

    //InformatiePopup_Form verbergen
    hideMededeling(True);
  end;

end.
